/*!
 * \file HftStrategyMgr.h
 * \project	WonderTrader
 *
 * \author Wesley
 * \date 2020/03/30
 * 
 * \brief HFT策略管理器头文件
 * 
 * 本文件定义了HFT(High Frequency Trading)策略管理器类，负责HFT策略工厂的加载、
 * 策略实例的创建和管理。支持动态加载策略工厂DLL/SO文件，创建和管理策略实例的生命周期。
 */
#pragma once
#include <memory>
#include <boost/core/noncopyable.hpp>

#include "../Includes/FasterDefs.h"
#include "../Includes/HftStrategyDefs.h"

#include "../Share/DLLHelper.hpp"

/**
 * @class HftStraWrapper
 * @brief HFT策略包装器类
 * 
 * 用于包装HFT策略实例，管理策略的生命周期，确保策略对象的正确创建和销毁。
 * 采用RAII模式，在析构时自动释放策略资源。
 */
class HftStraWrapper
{
public:
	/**
	 * @brief 构造函数
	 * 
	 * @param stra HFT策略实例指针
	 * @param fact HFT策略工厂指针
	 */
	HftStraWrapper(HftStrategy* stra, IHftStrategyFact* fact) :_stra(stra), _fact(fact){}
	
	/**
	 * @brief 析构函数
	 * 
	 * 自动释放策略实例资源
	 */
	~HftStraWrapper()
	{
		if (_stra)
		{
			_fact->deleteStrategy(_stra);
		}
	}

	/**
	 * @brief 获取策略实例
	 * 
	 * @return HFT策略实例指针
	 */
	HftStrategy* self(){ return _stra; }

private:
	HftStrategy*		_stra;	/**< HFT策略实例指针 */
	IHftStrategyFact*	_fact;	/**< HFT策略工厂指针 */
};

/**< HFT策略智能指针类型定义 */
typedef std::shared_ptr<HftStraWrapper>	HftStrategyPtr;

/**
 * @class HftStrategyMgr
 * @brief HFT策略管理器类
 * 
 * 负责管理HFT策略工厂和策略实例，提供策略的动态加载、创建和管理功能。
 * 
 * 主要功能包括：
 * - 动态加载HFT策略工厂DLL/SO文件
 * - 创建和管理HFT策略实例
 * - 策略实例的查找和获取
 * - 策略工厂的生命周期管理
 * 
 * @note HFT策略专门用于高频交易场景，对延迟和性能要求极高
 * @see HftStraWrapper, IHftStrategyFact
 */
class HftStrategyMgr : private boost::noncopyable
{
public:
	/**
	 * @brief 构造函数
	 */
	HftStrategyMgr();
	
	/**
	 * @brief 析构函数
	 */
	~HftStrategyMgr();

public:
	/**
	 * @brief 加载策略工厂
	 * 
	 * 从指定路径加载所有的HFT策略工厂DLL/SO文件
	 * 
	 * @param path 策略工厂文件所在目录路径
	 * @return 加载成功返回true，失败返回false
	 */
	bool loadFactories(const char* path);

	/**
	 * @brief 创建策略实例（通过策略名称）
	 * 
	 * 根据策略名称创建策略实例，策略名称格式为"工厂名.策略名"
	 * 
	 * @param name 策略名称，格式为"factname.unitname"
	 * @param id 策略实例ID
	 * @return 策略实例智能指针，失败返回空指针
	 */
	HftStrategyPtr createStrategy(const char* name, const char* id);
	
	/**
	 * @brief 创建策略实例（通过工厂名和策略名）
	 * 
	 * 根据指定的工厂名和策略名创建策略实例
	 * 
	 * @param factname 策略工厂名称
	 * @param unitname 策略单元名称
	 * @param id 策略实例ID
	 * @return 策略实例智能指针，失败返回空指针
	 */
	HftStrategyPtr createStrategy(const char* factname, const char* unitname, const char* id);

	/**
	 * @brief 获取策略实例
	 * 
	 * 根据策略ID获取已创建的策略实例
	 * 
	 * @param id 策略实例ID
	 * @return 策略实例智能指针，不存在返回空指针
	 */
	HftStrategyPtr getStrategy(const char* id);

private:
	/**
	 * @struct _StraFactInfo
	 * @brief HFT策略工厂信息结构体
	 * 
	 * 存储HFT策略工厂的详细信息，包括模块路径、句柄、工厂实例等。
	 * 包含构造和析构函数，自动管理工厂资源的生命周期。
	 */
	typedef struct _StraFactInfo
	{
		std::string		_module_path;	/**< 模块文件路径 */
		DllHandle		_module_inst;	/**< 模块句柄 */
		IHftStrategyFact*	_fact;		/**< HFT策略工厂实例 */
		FuncCreateHftStraFact	_creator;	/**< 创建工厂函数指针 */
		FuncDeleteHftStraFact	_remover;	/**< 删除工厂函数指针 */

		/**
		 * @brief 构造函数
		 * 
		 * 初始化工厂信息结构体
		 */
		_StraFactInfo()
		{
			_module_inst = NULL;
			_fact = NULL;
		}

		/**
		 * @brief 析构函数
		 * 
		 * 自动释放工厂资源
		 */
		~_StraFactInfo()
		{
			if (_fact)
				_remover(_fact);
		}
	} StraFactInfo;
	
	/**< HFT策略工厂映射表类型定义 */
	typedef faster_hashmap<LongKey, StraFactInfo> StraFactMap;

	/**< HFT策略工厂映射表 */
	StraFactMap	_factories;

	/**< HFT策略实例映射表类型定义 */
	typedef faster_hashmap<LongKey, HftStrategyPtr> StrategyMap;
	
	/**< HFT策略实例映射表 */
	StrategyMap	_strategies;
};

